package com.global.crypto.enums;

/**
 * 支持的对称加密算法枚举
 * 包含常见的对称加密算法及其支持的密钥长度范围
 */
public enum SymmetricAlgorithm {
    AES("AES", 128, 256),          // 高级加密标准（Advanced Encryption Standard），支持密钥长度 128、192 或 256 位
    DES("DES", 56, 56),            // 数据加密标准（Data Encryption Standard），固定使用 56 位密钥
    DESede("DESede", 112, 168),    // 三重 DES（Triple DES），支持 112 位或 168 位有效密钥长度
    BLOWFISH("Blowfish", 32, 448), // Blowfish 算法，支持 32 到 448 位可变长度密钥
    RC2("RC2", 40, 128),           // RC2 算法，支持 40 到 128 位可变长度密钥
    RC4("RC4", 40, 2048),          // RC4 流加密算法，支持 40 到 2048 位可变长度密钥（注意：RC4 在某些场景下被认为不安全）
    IDEA("IDEA", 128, 128),        // IDEA 算法（International Data Encryption Algorithm），固定使用 128 位密钥
    CAMELLIA("Camellia", 128, 256),// Camellia 对称加密算法，支持 128、192 或 256 位密钥
    SEED("SEED", 128, 128),        // SEED 算法，固定使用 128 位密钥，常用于韩国的加密标准
    GOST28147("GOST28147", 256, 256); // GOST 28147-89 加密标准，固定使用 256 位密钥，俄罗斯国家标准

    private final String name;     // 算法的标准化名称，通常与 Java Cryptography Architecture (JCA) 中的名称一致
    private final int minKeySize;  // 该算法所支持的最小密钥长度，单位为比特（bit）
    private final int maxKeySize;  // 该算法所支持的最大密钥长度，单位为比特（bit）

    /**
     * 构造函数，初始化对称加密算法的名称及支持的密钥长度范围
     *
     * @param name       算法名称
     * @param minKeySize 最小密钥长度（比特）
     * @param maxKeySize 最大密钥长度（比特）
     */
    SymmetricAlgorithm(String name, int minKeySize, int maxKeySize) {
        this.name = name;
        this.minKeySize = minKeySize;
        this.maxKeySize = maxKeySize;
    }

    /**
     * 获取算法的标准名称
     *
     * @return 算法名称字符串
     */
    public String getName() {
        return name;
    }

    /**
     * 获取该算法支持的最小密钥长度（比特）
     *
     * @return 最小密钥长度
     */
    public int getMinKeySize() {
        return minKeySize;
    }

    /**
     * 获取该算法支持的最大密钥长度（比特）
     *
     * @return 最大密钥长度
     */
    public int getMaxKeySize() {
        return maxKeySize;
    }
}
